package com.didispace.hystrixCommand;

import com.didispace.web.User;
import com.netflix.hystrix.HystrixCommand;
import com.netflix.hystrix.HystrixCommandGroupKey;
import org.springframework.web.client.RestTemplate;

// 第5章  服务容错保护： Spring Cloud Hystrix -- 使用详解 -- 请求缓存 -- 清理失效缓存功能
public class UserPostCommand extends HystrixCommand<User> {
    private RestTemplate restTemplate;
    private User user;

    public UserPostCommand(RestTemplate restTemplate, User user) {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("GetSetGet")));
        this.restTemplate = restTemplate;
        this.user = user;
    }

    // 而在 UserPostCommand 的实现中，在 run 方法调用依赖服务之后，增加了对 UserGetComrnand 中静态方法 flushCache 的调用，以实现对失效缓存的清理。  p162
    @Override
    protected User run() {
        // 写操作
        // User r = restTemplate.postForObject("http://USER-SERVICE/user5", user, User.class);
        //本地请求
        User r = restTemplate.postForObject("http://localhost:8081/user5", user, User.class);
        // 刷新缓存，清理缓存中失效的User
        UserGetCommand.flushCache(r.getName());
        return r;
    }

    /**
     * 降级。Hystrix会在run()执行过程中出现错误、超时、线程池拒绝、断路器熔断等情况时， 执行getFallBack()方法内的逻辑
     */
    @Override
    protected User getFallback() {
        return new User("error", 0);
    }

    // public static void main(String[] args) {
    //     //初始化context
    //     HystrixRequestContext.initializeContext();
    //
    //     // try {
    //     //     User user1 = new UserGetCommand(new RestTemplate(), "aaa", 15).execute();
    //     //     System.out.println("user1------------------"+user1.toString());
    //     //     User user2 = new UserGetCommand(new RestTemplate(), "aaa", 16).execute();
    //     //     System.out.println("user2------------------"+user2.toString());
    //     //     User user3 = new UserPostCommand(new RestTemplate(), new User("aaa", 16)).execute();
    //     //     System.out.println("user3------------------"+user3.toString());
    //     //     // 清理缓存后  把age变成了16查看效果
    //     //     User user4 = new UserGetCommand(new RestTemplate(), "aaa", 16).execute();
    //     //     System.out.println("user4------------------"+user4.toString());
    //     // } catch (Exception e) {
    //     //     e.printStackTrace();
    //     // }
    //
    //     try {
    //         User user1 = new UserGetCommand(new RestTemplate(), "aaa", 15).execute();
    //         System.out.println("user1------------------"+user1.toString());
    //         User user2 = new UserGetCommand(new RestTemplate(), "aaa", 16).execute();
    //         System.out.println("user2------------------"+user2.toString());
    //         User user3 = new UserPostCommand(new RestTemplate(), new User("aaa", 16)).execute();
    //         System.out.println("user3------------------"+user3.toString());
    //         // 清理缓存后  把age变成了16查看效果
    //         User user4 = new UserGetCommand(new RestTemplate(), "aaa", 16).execute();
    //         System.out.println("user4------------------"+user4.toString());
    //     } catch (Exception e) {
    //         e.printStackTrace();
    //     }
    // }
}

// User user1 = new UserGetCommand(new RestTemplate(), "aaa", 15).execute();
// user1------------------name=aaa, age=15
// User user2 = new UserGetCommand(new RestTemplate(), "aaa", 16).execute();
// user2------------------name=aaa, age=15
// User user3 = new UserPostCommand(new RestTemplate(), new User("aaa", 16)).execute();   // 清理缓存后  把age变成了16查看效果
// user3------------------name=aaa, age=16
// User user4 = new UserGetCommand(new RestTemplate(), "aaa", 16).execute();
// user4------------------name=aaa, age=16

// Spring Cloud系列（十六） Hystrix请求缓存（Finchley.RC2版本）
// https://blog.csdn.net/WYA1993/article/details/82390387